/*
 * @Author: QinJiu
 * @Date: 2022-07-20 10:12:27
 * @LastEditors: Qinjiu
 * @LastEditTime: 2022-07-20 15:23:47
 * @Description: 权限控制文件
 */

import router from "@/router";
import store from "@/store";
import NProgress from "nprogress"; // 进度条
import "nprogress/nprogress.css";
import * as auth from "@/utils/auth";
import _ from "lodash";
import awaitTo from "@/utils/await-to";

// 关闭NProgress的loading
NProgress.configure({ showSpinner: false });

// 路由白名单，无需登录
const whiteList = ["/login"];

router.beforeEach(async (to, from, next) => {
  NProgress.start();

  // 获取token
  const token = auth.getToken();

  // 已登录
  if (token) {
    // 已登录禁止访问login页面
    if (to.path === "/login") {
      next({ path: "/" });
      NProgress.done();
    } else {
      const userToken = store.getters.token; // 用户token
      const userInfo = store.getters.userInfo; // 用户信息
      // store 中不存在 token（场景：刷新页面）
      if (!userToken) {
        store.commit("SET_TOKEN", token);
      }
      // store 中不存在 userInfo（场景：刷新页面）
      if (_.isEmpty(userInfo)) {
        // 获取用户信息
        const [error, result] = await awaitTo(
          store.dispatch("user/getUserInfo"),
          token
        );
        // 接口异常
        if (error) {
          // 清除token等
          await store.dispatch("user/resetToken");
          // 携带当前路由path跳转到登录页
          next(`/login?redirect=${to.path}`);
          NProgress.done();
        }
        // 接口正常
        else {
          // 根据用户权限动态添加可访问路由表
          await store.dispatch(
            "permission/generateRoutes",
            store.getters.roles
          );
          next({ ...to, replace: true }); // hack方法 确保addRoutes已完成
        }
      }
      // 用户信息已存在
      else {
        next();
      }
    }
  }
  // 未登录
  else {
    // 无需登录：白名单
    if (whiteList.includes(to.path)) {
      next();
    }
    // 需登录
    else {
      // 携带当前路由path跳转到登录页
      next(`/login?redirect=${to.path}`);
      NProgress.done();
    }
  }
});

router.afterEach(() => {
  NProgress.done();
});
